<?php

/** @see Zend_Controller_Action */

class UserController extends Zend_Controller_Action {
	/**
	 * Akcja odpowiedzialna za rejestracje użytkownika
	 *
	 */
	public function registerAction() {
		$this->view->headTitle(_t('Rejestracja'), 'PREPEND');
		
		if (Zend_Auth::getInstance()->hasIdentity())
			throw new Zend_Controller_Action_Exception('User already loged in', 404);
		
		$form = new Default_Form_Users();
		$registerForm = $form->register();
		$data = $this->getRequest()->getPost();
		$session = new Zend_Session_Namespace('user');
		
		if (!empty($data)) {
			if ($registerForm->isValid($data)) {
				$userModel = new Default_Model_Users();
				
				if (!$userModel->register($data['nick'], $data['email'], $data['password'], $data)) {
					$this->_helper->FlashMessenger(_t('Wystąpił błąd podczas tworzenia użytkownika'));
				} else {
					// wyświetl komunikat
					$this->_helper->FlashMessenger(_t('Zostałeś zarejestrowany i możesz się teraz zalogować'));
					
					// mail z potwierdzeniem rejestracji
					$mail = new Core_Mail();
					$mail->addTo($data['email'], $data['nick']);
					$mail->setSubject(_t('Rejestracja w %apptitle%', array('apptitle' => Zend_Registry::get('config')->application->name)));
					$mail->setBodyTemplate('register', $data);
					
					try {
						$mail->send();
					} catch (Zend_Mail_Exception $e) {
						$this->_helper->FlashMessenger(_t('Wystąpił problem z wysyłką maila'));
					}
					
					$session->email = $data['email'];
					$this->_redirect($this->getFrontController()->getRouter()->assemble(array('controller' => 'user', 'action' => 'login'), null, true));
				}
			} else
				$this->_helper->FlashMessenger(_t('Formularz wypełniono niepoprawnie. Popraw zaznaczone poniżej błędy.'));
		}
		
		$this->view->registerForm = $registerForm;
	}

	/**
	 * Akcja służąca do logowania
	 *
	 */
	public function loginAction() {
		$this->view->headTitle(_t('Logowanie'), 'PREPEND');
		// Pobierz referencje do singletonu instancji Zend_Auth
		$auth = Zend_Auth::getInstance();
		$session = new Zend_Session_Namespace('user');
		$userModel = new Default_Model_Users();
		
		// jeśli zalogowany, przekieruj na główną
		if ($auth->hasIdentity()) {
			$this->_helper->FlashMessenger(_t('Użytkownik jest już zalogowany'));
			$this->_redirect('/');
		}
		
		// formatka i _POST
		$form = new Default_Form_Users();
		$loginForm = $form->login();
		$data = $this->getRequest()->getPost();
		
		if (!empty($data)) {
			if ($loginForm->isValid($data)) {
				
				// Próba potwierdzenia autetyczności
				$result = $userModel->login($data['email'], $data['password']);
				
				if (!$result->isValid()) {
					// Błąd autentyfikacji, wyświetl komunikaty
					foreach ($result->getMessages() as $message) {
						Zend_Registry::get('Zend_Log')->info('User "' . $data['email'] . '" login failed: "' . $message . '"');
						$this->_helper->FlashMessenger(_t($message));
					}
				} else {
					$session->email = $data['email'];
					
					// zapamiętaj na dłużej
					if ((bool) $data['remember']) {
						if (method_exists(Zend_Session::getSaveHandler(), 'setLifetime'))
							Zend_Session::getSaveHandler()->setLifetime(30 * 24 * 3600);
						Zend_Session::rememberMe();
					}
					
					$this->_redirect(rtrim($this->getRequest()->getBaseUrl(), '/') . '/' . ltrim(urldecode($this->_getParam('url', '')), '/'));
				}
			} else
				$this->_helper->FlashMessenger(_t('Formularz wypełniono niepoprawnie. Popraw zaznaczone poniżej błędy.'));
		}
		$this->view->loginForm = $loginForm;
	}
	
	/**
	 * Przypominacz haseł
	 * 
	 */
	public function remindAction() {
		$this->view->headTitle(_t('Przypomnij hasło'), 'PREPEND');
		
		if (Zend_Auth::getInstance()->hasIdentity())
			throw new Zend_Controller_Action_Exception('User already logged in', 404);
		
		$usersModel = new Default_Model_Users();
		$form = new Default_Form_Users();
		$mail = new Core_Mail();
		$data = $this->getRequest()->getPost();
		$session = new Zend_Session_Namespace('user');
		$remindForm = null;
		
		// jeśli jest hash, to jest to drugi krok
		if (strlen($this->getRequest()->getParam('hash')) > 12) {
			// rozpakujmy hasha
			$hash = $this->getRequest()->getParam('hash');
			$time = base_convert(substr($hash, -7, 7), 36, 10);
			$rand = base_convert(substr($hash, 0, 5), 36, 10);
			$id = base_convert(substr($hash, 5, -7), 36, 10);
			
			// sprawdźmy, czy nie przestarzały...
			if ($time + 3600 < time())
				$this->_helper->FlashMessenger(_t('Podany hash jest za stary, spróbuj ponownie'));
			else {
				// pobierzmy z bazy użytkownika
				$user = $usersModel->getUserById($id);
				// sprawdzmy, czy w ogole jest
				if (!$user || !($user instanceof StdClass) ||
					// i czy hash się zgadza
					$user->hash !== md5($id . $rand . $time))
						//powiadommy o tym usera
						$this->_helper->FlashMessenger(_t('Podany hash jest błędny'));
				else {
					// wszystko ok, zmieniamy hasełko userowi
					/*
					$chars = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
					shuffle($chars);
					$password = '';
					for ($i = 0; $i < 8; ++ $i)
						$password .= $chars[array_rand($chars)];
					*/
					$remindForm = $form->remind2();
					
					if (empty($data)) // nie ma danych z formatki
						$this->_helper->FlashMessenger(_t('Możesz teraz zmienić hasło dla użytkownika %user%', array('user' => $user->email)));
					else { // formularz zmiany hasła
						if ($remindForm->isValid($data)) {
							// jeśli zmieniono poprawnie, zaktualizuj w bazie
							if ($usersModel->updateUser($id, array(
								'hash' => null, // wyzerujmy hash
								'password' => $remindForm->getValue('password') // ustawmy nowe hasło
							))) {
								$this->_helper->FlashMessenger(_t('Hasło zostało zmienione poprawnie'));
								$session->email = $user->email;
								$this->_redirect($this->getFrontController()->getRouter()->assemble(array('controller' => 'user', 'action' => 'login'), null, true));
							} else
								//niedobrze..
								$this->_helper->FlashMessenger(_t('Wystąpił problem przy aktualizacji profilu'));
						} else
							$this->_helper->FlashMessenger(_t('Formularz wypełniono niepoprawnie. Popraw zaznaczone poniżej błędy.'));
					}
				}
			}
		}
		
		if (empty($remindForm)) {
			// formularz przypominania hasła
			$remindForm = $form->remind();
			if (!empty($data)) {
				if ($remindForm->isValid($data)) {
					
					$hash = $usersModel->hashUpdate($data['email']);
					if (!empty($hash)) {
						$mail->addTo($data['email']);
						$mail->setSubject(_t('Przypomnienie hasła %apptitle%', array('apptitle' => Zend_Registry::get('config')->application->name)));
						$mail->setBodyTemplate('remind', $data + array('hash' => $hash, 'appurl' => Zend_Registry::get('config')->application->url));
						
						try {
							$mail->send();
							$this->_helper->FlashMessenger(_t('Link pozwalający na zmianę hasła, został wysłany na podany adres email'));
							$this->_redirect($this->getFrontController()->getRouter()->assemble(array('controller' => 'user', 'action' => 'login'), null, true));
						} catch (Zend_Mail_Exception $e) {
							$this->_helper->FlashMessenger(_t('Wystąpił problem z wysyłką maila'));
						}
					} else
						$this->_helper->FlashMessenger(_t('Wpisany adres email nie istnieje w naszej bazie'));
				} else
					$this->_helper->FlashMessenger(_t('Formularz wypełniono niepoprawnie. Popraw zaznaczone poniżej błędy.'));
			}
		}
		
		// pokaż formularzyk z przypomnieniem hasła
		$this->view->remindForm = $remindForm;
	}
	
	/**
	 * Akcja wylogowująca użytkownika
	 *
	 */
	public function logoutAction() {
		if (!Zend_Auth::getInstance()->hasIdentity())
			throw new Zend_Controller_Action_Exception('User already not loged in', 404);
		
		// zapomnij o mnie!
		Zend_Session::forgetMe();
		Zend_Session::expireSessionCookie();
		
		// usun z Zend_Auth
		$auth = Zend_Auth::getInstance();
		$auth->clearIdentity();
		
		$this->_redirect($this->getFrontController()->getRouter()->assemble(array(), 'default', true));
	}
}